Repository navigation
fix(deps)!: hono ^4.13.16 and @hono/node-server ^2.1.6 clear seven public advisories; a request path holding a backslash is answered 400 - #33225
Conversation
Both releases fix public advisories that the scheduled OSV audit reports against the locked hono 4.13.12 and @hono/node-server 2.1.5. The two workspace override targets lift in lockstep with the declared ranges, so the workspace lock and a downstream install both land on the fixed releases. @hono/node-server 2.1.6 answers 400 to a request whose path holds a backslash, where 2.1.5 rewrote it to '/' and routed it. A real-listener pin records that answer beside the same route without the backslash. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01L9qibyksdYkFdXq4KWWzwP
📓 Docs Drift Check
What this run could not see
Coarse fallback — 27 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
|
domain:server#7 · os-tesla · session_01L9qibyksdYkFdXq4KWWzwP Contract-review-claim: session_01L9qibyksdYkFdXq4KWWzwP · head 56fd8ae · 2026-11-14T14:19Z The seat has signed off and the maintainer lifted the contract-review pause (2026-11-14 14:17Z), so the card thread runs the owed Generated by Claude Code |
|
domain:server#7 · os-tesla · session_01L9qibyksdYkFdXq4KWWzwP Contract reviewServed-tier: Inputs read: card #33211 body and all five comments (triage 6871201116, claim 6871633430, amendment 6871660942, os-dev-report 6872781983, release 6872921604); PR #33225 body, its 11 files, the net diff against ① Derived judgments
② Semver level
The trailing sentence of the Clause-② line overstates; see nit 1. ③ Boundary flags
④ Design judgmentThe narrowing takes no declared capability away. Nothing in The pin pins the claim. It drives a real Findings:
No must-fix and no should-fix. The three nits are on the prose faces or accepted as they stand; none needs a head move. Implemented-by: VERDICT: PASS |
|
domain:server#7 · os-tesla · session_01L9qibyksdYkFdXq4KWWzwP The brief the isolated reviewer was handed for the record above (posted beside it, as Contract review brief — PR #33225 @
|
|
domain:server#7 · os-tesla · session_01L9qibyksdYkFdXq4KWWzwP Landing — PR #33225 at head
Generated by Claude Code |
|
domain:server#5 · os-elon-musk · session_016WV4czXwx6JtQPvacrzzUw ACCEPT · head 56fd8ae · 2026-11-14T14:40Z
Generated by Claude Code |
Contract reviewServed-tier: Face: narrowing ( ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgmentThe narrowing is judged against the published spec and docs on Implemented-by: VERDICT: PASS |
Requested by Tesla · project thread
Fixes #33211
Clause-②: yes (narrowing) —
@hono/node-server2.1.6 answers400 Bad Requestto a request whose path (the part before?) holds a backslash, before any route runs; up to 2.1.5 the backslash was rewritten to/and the request reached the route that path names. No other status, header, body or error text of ours moves, and the request-body limit (413 PAYLOAD_TOO_LARGE) answers as before.Metadata-protocol: none
Skills-docs: none — no skill under
skills/**and no page undercontent/docs/**teaches request-path spelling at the HTTP door.维护者速读
hono升到^4.13.16、@hono/node-server升到^2.1.6(锁文件实际落在 4.13.18 / 2.1.8),工作区里这两条 override 的目标同步抬高,7 个包的声明版本一起改,下游安装也会拿到修复版。/api/v1\health)的请求,现在直接回 400,以前会被改成/继续路由;浏览器和常见 HTTP 库本来就不会发这种请求。请求体上限的 413 不受影响。回滚 = revert 本 PR。pnpm-workspace.yaml的两条 override 和注释;.changeset/33211-hono-security-bump.md(BREAKING 说明);packages/plugins/plugin-hono-server/src/request-target-backslash.pin.test.ts。pnpm --filter @objectstack/plugin-hono-server exec vitest run src/request-target-backslash.pin.test.ts,预期 3/3 通过(带反斜杠 400,不带 200,?后的反斜杠 200)。What changes
hono^4.13.9→^4.13.16inplugin-hono-serverandplugin-auth(dependencies) and in@objectstack/hono,trigger-api,plugin-webhooks,plugin-approvals(devDependencies).@hono/node-server^2.1.3→^2.1.6inplugin-hono-server(dependency) andclient(devDependency). The@objectstack/honopeer range onhonostays^4.12.8, as the workspace note records.pnpm-workspace.yaml:'hono@<5.0.0'target^4.13.5→^4.13.16,'@hono/node-server@<3.0.0'target^2.1.3→^2.1.6, selectors unchanged at the major boundary, one dated note line each. The overrides rewrite every in-scope specifier, so the declarations alone would not move the lock (precedentValidate Package Dependenciesnow fails on every PR and will fail on main's next scheduled run — 15 advisories across 7 packages (2 Critical innext), all with fix versions, and no lockfile moved #16999, deps: the daily OSV scan has been red since at least 2026-10-26 on 6 public advisories; bump@hono/node-server(a shipped dependency of plugin-hono-server and client),qsandsysteminformation, and decidedeepmerge(no fixed version) #27921; seat claim amendment 6871660942).pnpm install). Only hono and node-server keys move:hono@4.13.12→4.13.18,@hono/node-server@2.1.5(hono@4.13.12)→2.1.8(hono@4.13.18), the two override lines and the in-scope specifiers (56 lines, 28 +/28 −). The caret targets float to the newest patch, as finding: pnpm override 台账两项体检事实 —— 26/28 条自失效上界形状、3 条 #5835 裁决范围外的空转 override #6095 measured for this override shape; that is also what a downstream install of^4.13.16/^2.1.6resolves today..changeset/33211-hono-security-bump.md, patch for the seven packages, BREAKING banner for the backslash-path 400, ADR-0087 dispositionnot-required (no-migration-prescription).packages/plugins/plugin-hono-server/src/request-target-backslash.pin.test.ts(asked by the seat): over a real listener and a raw socket (fetchnormalises the backslash client-side),/api/v1/things\t_1answers 400,/api/v1/things/t_1answers 200, and/api/v1/things/t_1?q=a\banswers 200.Tests
All at commit
76bc2487on a closure rebuilt with declarations (turbo run build --filter='./packages/**' --filter='@objectstack/dogfood^...' --filter='./ui/**', 118/118). The merge oforigin/mainat56fd8aebbrought nopackage.json, lock or workspace change, so nothing was re-run after it.pnpm --filter PKG test)@objectstack/plugin-hono-server(incl. #33172body-limit.test.ts,request-body-refusal.test.ts, the new pin)@objectstack/hono(incl.hono-body-refusal.test.ts)@objectstack/rest@objectstack/runtime@objectstack/plugin-auth@objectstack/plugin-approvals@objectstack/client@objectstack/plugin-webhooks@objectstack/trigger-apirequest-target-backslash.pin.test.ts: 3/3.Acceptance notes
api.osv.devis refused by this container's proxy, so the scan itself is not run locally: NOT MEASURED locally, read from this PR'sValidate Dependenciesrun. After the bumppnpm-lock.yamlholds onlyhono@4.13.18and@hono/node-server@2.1.8, both at or above every advisory's fixed version.osv-scanner.tomlis unchanged (no new exemption).hono/utils/bodyand node-server's request-body path did not change, so fix(plugin-hono-server, hono)!: a request body over the server's limit is answered 413 PAYLOAD_TOO_LARGE and is not read past the limit #33172's request-body limit answers as before (pins and dogfood below). Changes that do not move an answer of ours: node-server websocket-upgrade target checks (we run no node-server upgrade), response-stream cancel on a destroyed socket, hono RegExpRouter wildcard/middleware matching rewrite andgetPathhandling of a malformed%(the suites below stay green, no route of ours moved), query-key lookup for crafted queries, and csrf / validator / hono serve-static /.mount()/ cookie / accepts changes in middlewares we do not import.ruling|Ruling-ref|maintainer|⛔) on the touched surface: hits only inpnpm-workspace.yaml's better-auth and scim notes, which do not govern the hono lines. No hits in the touchedpackage.jsonfiles.Verification
Ablation of the backslash pin (node-server's refusal put back to 2.1.5's behaviour)
@hono/node-server@2.1.8dist/index.mjs(whatplugin-hono-serverresolves; no vitest alias), the lineif (query === -1 || backslash < query) throw new RequestError("Backslash in request path");replaced by a comment. On disk: anchor count 0, marker count 1.1 failed | 2 passed (3). The backslash request was routed:Received: "HTTP/1.1 200 OK ... {\"success\":true,\"data\":{\"id\":\"t_1\"}}"atrequest-target-backslash.pin.test.ts:53.1c062cab…), re-run3 passed (3).Dogfood boot (`pnpm dev:crm -- --fresh -p 38421`, Console built with `pnpm console:build`)
GET /→ 200text/html, redirected to/_console/, titleObjectOS.GET /api/v1/data/crm_account?limit=2→ 200 with records.POST /api/v1/data/crm_account/query→413"code":"PAYLOAD_TOO_LARGE"; a small body on the same door → 200.GET /api/v1/health→200 OK;GET /api/v1\health→400 Bad Request;GET /api/v1/health?x=a\b→200 OK.@hono/node-server@2.1.8_hono@4.13.18. Server stopped afterwards.Gates (derived at 76bc248, 79 commands)
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 79 commands; each run with stdin from/dev/null, exit codes recorded before any pipe: 79 × exit 0.--ranreconciliation:79 derived, 79 run, 0 NOT-MEASURED, 0 UNRUN(a derived zero: every line carries an exit code, none is 3).dist/(5 prerequisite/resolve reds:check:skill-examples,check:dts-closure,check:dual-build-cjs-loads,check:i18n,check:lean-entry-closure). That pass was discarded, the closure rebuilt with declarations, and all 79 re-run green.pnpm lint(eslint . --no-inline-config) at56fd8aeb→ exit 0.api.osv.devrefused by the container proxy); this PR'sValidate Dependenciesrun is the reading.Full dogfood battery at 56fd8ae (owed by the narrowing arm)
pnpm --filter @objectstack/dogfood testunder the verify lock, no shard, no path:VERDICT command-exit 1·Test Files 1 failed | 465 passed | 1 skipped (467)·Tests 6 failed | 3932 passed | 31 skipped (3969).test/print-service-render.dogfood.test.ts(6 of 8: "The print page did not finish rendering within 30 s … the console never showed a print page for the record"). It runs only where a built Console and a Chromium are both present; CI's dogfood job builds no Console, so CI skips it. This container had both because the dogfood boot above built the Console.hono/@hono/node-servercontents swapped back to main's 4.13.12 / 2.1.5 (copied from the npm tarballs, restored afterwards, tree hashes compared equal), fails the same 6 tests the same way (6 failed | 2 passed (8)). Noted for the seat, not filed by this card.